home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
zugabe
/
va45
/
visual45
/
objects
/
form
/
common.s
< prev
next >
Wrap
Text File
|
1998-09-06
|
27KB
|
975 lines
DATA
GWVA_FORM_DEFAULT_METHODLIST:
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_CREATE,GWVA_FORM_PRG_CREATE
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_DELETE,GWVA_FORM_PRG_DELETE
GWVA_OBJ_STRUCT_METHOD GWVA_METHOD_FORM_BUTTON,GWVA_FORM_PRG_FORM_BUTTON
GWVA_OBJ_STRUCT_METHOD_END_LIST
TEXT
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_CREATE
; Asm label : GWVA_FORM_PRG_CREATE
; Description : Création d'un objet formulaire
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur la fenêtre
; in : a2.l = pointeur sur le tree du ressource
; out : d6.w = GWVA_PRGRET_CONSUMED
; out : d7.w = GWVA_NO_ERROR_GENERIC ou erreur
; GWVA_ERROR_BAD_CLASS
;
; 15/02/98 : Création
; 01/05/98 : Modification : test handle, test class, appel méthode CREATED
;------------------------------------------------------------------------------
GWVA_FORM_PRG_CREATE:
GWVA_CHECK_OBJ_HANDLE
;-----------------------------------;
;-----------------------------------;
; envoyer la méthode GWVA_METHOD_CREATED
GWVA_EXEC_VISUAL_EVENT #GWVA_METHOD_CREATED
moveq #GWVA_PRGRET_CONSUMED,d6
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.bad_object_class:
move #GWVA_ERROR_BAD_CLASS,d7 ; pas une classe formulaire
moveq #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_DELETE
; Asm label : GWVA_FORM_PRG_DELETE
; Description : Destruction d'un objet formulaire
;
; in : a0.l = pointeur sur l'objet
; out : d6.w = GWVA_PRGRET_CONSUMED
; out : d7.w = GWVA_NO_ERROR_GENERIC
;
; 15/02/98 : Création
;------------------------------------------------------------------------------
GWVA_FORM_PRG_DELETE:
moveq #GWVA_PRGRET_CONSUMED,d6
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FORM_BUTTON
; Asm label : GWVA_FORM_PRG_FORM_BUTTON
; Description : Effectue un form button sur un objet rsc
;
; Rq : Réagit graphiquement au clic => appel à FORM_BUTTON et retourne
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur le buffer d'entrée typé GWVA_FORM_BUTTON_IN
; in : a2.l = pointeur sur le buffer de sortie typé GWVA_FORM_BUTTON_OUT
; in : d0.l = [ X.w | num gem.w ]
; in : d1.l = [ Y.w | mouse button.w ]
; in : d2.l = [ Key state.w | mouse count.w ]
; out : d0.w = retour de la fonction
; out : d1.w = newobject (bit 15 mis si double clic et touche-exit)
; out : d6.w = GWVA_PRGRET_NOT_CONSUMED ou GWVA_PRGRET_CONSUMED
;
; 07/03/98 : Création
;------------------------------------------------------------------------------
GWVA_FORM_PRG_FORM_BUTTON:
btst #0,d1 ; bouton clické ?
beq .its_not_left_button
*.traite_click_formulaire:
move.l GWVA_FORM_BUTTON_IN_TREE_PTR(a1),a3
move d0,d3
mulu #L_OBJECT,d3
add.l d3,a3
; on teste si je suis pas sélectable mais que mon père le serait
; et dans ce cas on fait comme si il avait cliqué dans mon père
btst #SELECTABLE,ob_flags+1(a3)
bne.s .je_suis_selectable
save.l d0-d2/a0-a3
move.l GWVA_FORM_BUTTON_IN_TREE_PTR(a1),a0 ; a0.l + d0.w num obj
bsr GWVA_RSC_FIND_FATHER_OBJECT
move d0,d3
move.l a0,a4
load.l d0-d2/a0-a3
cmp.w #GWVA_NO_ERROR_GENERIC,d7
bne.s .click_in_root
btst #SELECTABLE,ob_flags+1(a4)
beq.s .mon_pere_est_pas_selectable
move d3,d0 ; l'objet cliqué devient le père
move.l a4,a3 ; ruse pour les caractères "shortcut" sur les boutons
.mon_pere_est_pas_selectable:
.je_suis_pas_selectable:
.click_in_root:
.je_suis_selectable:
; à partir d'ici A3 pointe sur l'objet dans le formulaire
move ob_state(a3),d3 ; D3 à sauver à partir d'ici (ancien état)
move.w d0,GWVA_FORM_BUTTON_OUT_OBJECT(a2)
move.w d3,GWVA_FORM_BUTTON_OUT_OLD_STATE(a2)
move.l a3,GWVA_FORM_BUTTON_OUT_OBJ_PTR(a2)
move #1,GWVA_FORM_BUTTON_OUT_RET_CODE(a2) ; si disabled
btst #DISABLED,d3
bne .object_disabled
;--------------
ifd MDL_FORM_EDITABLE_TEXT2
; a2 ne pointe plus sur le objet du rsc
btst #EDITABLE,ob_flags+1(a2) ; éditable ? G_FTEXT G_FBOXTEXT
beq .pas_texte_editable
; d0 : objet
** d2 est scratché !
; d2 : quoi redressiner
; d3 : état de l'objet avant modifs
; a0 : window
; a1 : ptr form struct
; a2 : ptr objet cliqué
save.l d0/d2/d3/a0-a2
v_hide_c
movem.l (sp),d0/d2/d3/a0-a2
bsr GWVA_WFORM_OBJ_PRG_HIDE_CURSOR
movem.l (sp),d0/d2/d3/a0-a2
cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
beq.s .no_lost_focus_cause_no_change_objet
move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
move #GWVA_EVNT_LOSTFOCUS,d7
lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
movem.l (sp),d0/d2/d3/a0-a2
.no_lost_focus_cause_no_change_objet:
; Affiche le curseur texte sur le nouvel objet
move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),-(sp) ; on sauve avant d'écraser
ifd OPT_GWVA_WIND_FORM_CURS_POS_WITH_MOUSE
move.w GWVA_APP_OBJ_EVNT_MULTI_MX,d1
bsr GWVA_WFORM_OBJ_PRG_DRAW_CURSOR_X
else
move.l GWVA_WFORM_OBJ_FORM_PTR(a1),a2
move.w d0,d1
mulu #L_OBJECT,d1
move.w ([a2,d1.l,ob_spec],te_txtlen),d1
subq.w #1,d1 ; positionne à la fin du champ éditable
; (comportement du V.A. normal)
bsr GWVA_WFORM_OBJ_PRG_DRAW_CURSOR
endc
move.w (sp)+,d1 ; Ancien objet ayant le focus
movem.l (sp),d0/d2/d3/a0-a2
cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d1
beq.s .no_got_focus_cause_no_change_objet
; d0 : objet gagnant le focus
move #GWVA_EVNT_GOTFOCUS,d7
lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
movem.l (sp),d0/d2/d3/a0-a2
.no_got_focus_cause_no_change_objet:
v_show_c #1
ifd MDL_CHILDREN_WINDOWS
movem.l (sp),d0/d2/d3/a0-a2
bsr GWVA_WIND_OBJ_PRG_RETURN_TOP_FAMILY_MEMBER
bsr GWVA_WIND_OBJ_PRG_RETURN_FOCUSED_CHILD
tst d7
bmi.s .no_focused_at_this_time
bclr #GWVA_WIN_BIT_FOCUSED,GWVA_WIND_OBJ_STATUS+1(a0)
.no_focused_at_this_time:
load.l d0/d2/d3/a0-a2
bset #GWVA_WIN_BIT_FOCUSED,GWVA_WIND_OBJ_STATUS+1(a0)
else
load.l d0/d2/d3/a0-a2
endc ; ifd MDL_CHILDREN_WINDOWS
.pas_texte_editable:
endc ; ifd MDL_FORM_EDITABLE_TEXT
;--------------
save.l d0-d3/a0-a3
form_button GWVA_FORM_BUTTON_IN_TREE_PTR(a1),d0,d2 ; ptr,obj,m_count
move d0,d5
move.w int_out+2,d4 ; *newobject : index de l'objet s'il est
; éditable ou exit (bit 15 mis si double clic et touche-exit)
load.l d0-d3/a0-a3
move.w d5,GWVA_FORM_BUTTON_OUT_RET_CODE(a2)
move.w d4,GWVA_FORM_BUTTON_OUT_NEW_OBJECT(a2)
; il retourne un zéro si
; bouton est exit avec le click relaché dans le bouton
; bouton est touch_exit qqs la position de la souris au relachement
tst d5
bne.s .propriete_exit_non_activee
; conditions de redessin ...
btst #RBUTTON,ob_flags+1(a3)
bne.s .radio_no_redraw ; car radio bouton : le GEM
; a déjà dessiné pour nous
btst #SELECTABLE,ob_flags+1(a3) ; l'objet doit etre selectionable pour changer d'état
beq.s .no_selectable
bclr #SELECTED,ob_state+1(a3) ; désélection de l'objet
beq.s .no_redraw_object ; pas de redraw si pas sélectionné
* move.w #1,d1
** d2 est scratché !
* ; d2 est configuré !
* save.l d0-d3/a0-a3
* bsr GWVA_FORM_WIND_OBJ_PRG_REDRAW_PART
* load.l d0-d3/a0-a3
save.l d0-d3/a0-a3
* move.l GWVA_FORM_BUTTON_IN_WIND_PTR(a1),a0
* bsr GWVA_WIND_RETURN_INT_ABS_POS_SIZE
* swap d2
* move d3,d2
* GWVA_CALL_METHODNTEST #GWVA_METHOD_WIND_REDRAW_PART_CONTENTS,#GWVA_MODE_SEARCH_EXEC_UNIQUE
move.l GWVA_FORM_BUTTON_IN_WIND_PTR(a1),a0
lea GWVA_WFORM_FBUTTON_TMP_OBJ_LIST,a1
move.w d0,(a1)
move.w #1,2(a1)
move.w #GWVA_WRSC_CTE_REDRAW_PART_END_LIST,4(a1)
GWVA_CALL_METHOD_OTHER_OBJ #GWVA_METHOD_WRSC_REDRAW_PART_CONTENTS
load.l d0-d3/a0-a3
.no_redraw_object:
.no_selectable:
bra.s .envoie_message ; de toute façon
.radio_no_redraw:
.propriete_exit_non_activee:
; soit radio juste sélectable
; soit bouton juste selectable
btst #SELECTABLE,ob_flags+1(a3) ; sélectionnable ?
beq .pas_selectionable
cmp.w ob_state(a3),d3
beq .etat_inchange
btst #RBUTTON,ob_flags+1(a3)
beq.s .bouton_normal
; ici : radio-bouton
save.l d0-d3/a0-a3
move.l GWVA_FORM_BUTTON_IN_TREE_PTR(a1),a0 ; a0.l + d0.w num obj
bsr GWVA_RSC_FIND_FATHER_OBJECT
move d0,d4
load.l d0-d3/a0-a3
swap d0 ; on garde l'obj cliqué mais on bosse avec le père
move d4,d0
.bouton_normal:
.envoie_message:
******
ifeq 1
******
; le dessin de l'objet a été modifié car l'objet a changé d'état
; il est peut-être radio sans rien ou juste selectable
lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
.do_research:
tst GWVA_WFORM_OBJ_DEF_OBJ_NUM(a2)
bmi .objet_clicke_non_trouve ; pas dans la liste
cmp.w GWVA_WFORM_OBJ_DEF_OBJ_NUM(a2),d0
beq.s .found_obj
lea GWVA_WFORM_OBJFORMLIST_LENGTH(a2),a2
bra.s .do_research
.found_obj: move.l GWVA_WFORM_OBJ_DEF_OBJ_PTR_STRUCT(a2),a3 ; ptr sur la structure de l'objet
********* Traitement de l'évènement click en fonction du type d'objet ******
cmp.w #GWVA_FORM_WIND_OBJECT_GENERIC,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
bne.s .not_a_generic_object ; objet generic = non selectionnable
save.w d0-d3
save.l a0-a3
bsr GWVA_WFORM_OBJ_PRG_METHD_GENERIC
load.l a0-a3
load.w d0-d3
.not_a_generic_object:
cmp.w #GWVA_FORM_WIND_OBJECT_BUTTON,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
bne.s .not_a_button_object ; objet bouton = selectionnable
save.w d0-d3
save.l a0-a3
bsr GWVA_WFORM_OBJ_PRG_METHD_SELECT
load.l a0-a3
load.w d0-d3
.not_a_button_object:
ifd FORM_OBJ_POPUP
cmp.w #GWVA_FORM_WIND_OBJECT_MENU_POPUP,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
bne .not_a_menu_popup
save.w d0-d3
save.l a0-a3
bsr GWVA_WFORM_OBJ_PRG_METHD_POPUP
load.l a0-a3
load.w d0-d3
.not_a_menu_popup:
endc
ifd FORM_OBJ_RADIO_BUTTON
cmp.w #GWVA_FORM_WIND_OBJECT_RADIO_BUTTON,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
bne .not_a_radio_bouton
save.w d0-d3
save.l a0-a3
bsr GWVA_WFORM_OBJ_PRG_METHD_RADIO
load.l a0-a3
load.w d0-d3
.not_a_radio_bouton:
endc
ifd FORM_OBJ_CLICK_EQUIV
cmp.w #GWVA_FORM_WIND_OBJECT_CLIK_EQUIV,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
bne.s .not_a_click_eq_object
save.w d0-d3
save.l a0-a3
bsr GWVA_WFORM_OBJ_PRG_METHD_EQUIVALENT
load.l a0-a3
load.w d0-d3
.not_a_click_eq_object:
endc
ifd FORM_OBJ_EXTD_TEXT
cmp.w #GWVA_FORM_WIND_OBJECT_EXTD_TEXT,GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2)
bne.s .not_an_extd_text_object
save.w d0-d3
save.l a0-a3
bsr GWVA_WFORM_OBJ_PRG_METHD_EXTD_TEXT
load.l a0-a3
load.w d0-d3
.not_an_extd_text_object:
endc
ifd OPT_GWVA_WIND_FORM_CUSTOM_OBJECTS
tst.l GWVA_WFORM_OBJ_CUSTOM_OBJ_PRG
beq.s .no_routine_present
move.w GWVA_WFORM_OBJ_DEF_OBJ_TYPE(a2),d1 ; seul param non déjà initialisé
; d0.l = No de l'objet : cas spécial pour le radio bouton : objet clique dans le mot haut, père dans le mot bas
; d1.w = type de l'objet
; d2.w = que redessiner dans le cas d'un redraw d'une partie du form
; d3.w = état de l'objet avant objc_edit
; a0.l : pointeur sur la fenêtre
; a1.l : pointeur sur la structure spécifique à la fenêtre FORMULAIRE
; a2.l : pointeur sur la structure décrivant l'objet cliqué (No,shortcut,Type,Ptr struc)
; a3.l : pointeur sur Ptr struc
jsr ([GWVA_WFORM_OBJ_CUSTOM_OBJ_PRG.l])
.no_routine_present:
endc
bra GWVA_MAIN_EVENTS_LOOP
*-----------------*
*.objet_clicke_non_trouve:
* move.l GWVA_WFORM_OBJ_FORM_PTR(a1),a2
* move d0,d3
* mulu #L_OBJECT,d3
* add.l d3,a2
******
endc ; ifeq 1
******
.etat_inchange:
.pas_selectionable:
.object_disabled:
move.w ob_state(a3),GWVA_FORM_BUTTON_OUT_NEW_STATE(a2)
move.w ob_type(a3),GWVA_FORM_BUTTON_OUT_NEW_TYPE(a2)
* tst.l GWVA_WFORM_OBJ_CLICK_ROUTINE(a1)
* beq.s .pas_de_routine_click
* ; a0 = pointe sur la fenêtre formulaire
* ; a1 = pointe sur la structure formulaire
* ; a2 = pointeur sur la structure de l'objet clické
* ; d0 = numéro de l'objet
* ; d1.w = object flags
* ; d2.w = object state
* movem.w ob_flags(a2),d1-d2
* jsr ([GWVA_WFORM_OBJ_CLICK_ROUTINE,a1])
* bra GWVA_MAIN_EVENTS_LOOP
*
*.pas_de_routine_click:
.its_not_left_button:
moveq #GWVA_PRGRET_CONSUMED,d6
rts
BSS
GWVA_WFORM_FBUTTON_TMP_OBJ_LIST: ds.w 2+1
TEXT
;------------------------------------------------------------------------------
;!!!!!!!!!!!!!!!!!!!!!
ifd MDL_FORM_EDITABLE_TEXT
;!!!!!!!!!!!!!!!!!!!!!
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FORM_KEYBD
; Asm label : GWVA_FORM_PRG_FORM_KEYB
; Description : Méthode pour traiter l'effet de l'appui d'une touche sur un champ texte
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur le buffer de sortie typé GWVA_FORM_KEYB_IN
; in : a2.l = pointeur sur le buffer de sortie typé GWVA_FORM_KEYB_OUT
; in : d0.w = Champs texte où appliquer le Key code ou 0.w si aucun champ éditable
; in : d2.w = Key code
; out : d6.w = GWVA_PRGRET_NOT_CONSUMED s'il faut faire un objc_edit derrière
; ou GWVA_PRGRET_CONSUMED si la touche a été consommée
;
; 10/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FORM_PRG_FORM_KEYB:
save.l a0-a2/d0-d2
form_keybd GWVA_FORM_KEYB_IN_TREE_PTR(a1),d0,#1,d2
move d0,d3
load.l a0-a2/d0-d2
move.w d3,GWVA_FORM_KEYB_OUT_RET_CODE(a2)
move.w int_out+1*2,d4
move.w d4,GWVA_FORM_KEYB_OUT_NEW_OBJECT(a2)
move.w int_out+2*2,d5
move.w d5,GWVA_FORM_KEYB_OUT_KEY_OUT(a2)
tst d3 ; 0 = bouton 'exit' default, 1 = pas de bouton en 'default'
beq .objet_defaut_active
tst d5 ; a-t-il réussi à la traiter ?
bne .fkbd_pas_pu_traiter_touche
; Patch pour le GEM qui renvoie new_obj =0 si pressé enter
; et pas de bouton default
tst d4
bne.s .pas_patch_new_obj_eq_0
.common_patch_buggy_default:
move d3,GWVA_FORM_KEYB_OUT_NEW_OBJECT(a2) ; new=old => ne rien faire
.pas_patch_new_obj_eq_0:
.objet_defaut_active_correctement:
moveq #GWVA_PRGRET_CONSUMED,d6
rts
;----------
.objet_defaut_active:
move d4,d6 ; new obj
mulu #L_OBJECT,d6
add.l GWVA_FORM_KEYB_IN_TREE_PTR(a1),d6
move.l d6,a3
* btst #EDITABLE,ob_flags+1(a3) ; éditable ?
* beq .next_obj_pas_editable
bclr #SELECTED,ob_state+1(a3) ; désélection de l'objet
btst #DISABLED,ob_state+1(a3) ; objet 'default' disable ? -> on doit le réafficher deselectionner ?_PATCH_?
bne.s .objet_defaut_active_but_disable
btst #SELECTABLE,ob_flags+1(a3) ; objet 'default' pas selectable ? -> on doit le réafficher deselectionner ?_PATCH_?
beq.s .objet_defaut_active_but_not_selectable
bra.s .objet_defaut_active_correctement
.objet_defaut_active_but_not_selectable:
.objet_defaut_active_but_disable:
move.w #1,GWVA_FORM_KEYB_OUT_RET_CODE(a2) ; on vire le 'default activated'
bra.s .common_patch_buggy_default
;----------
.fkbd_pas_pu_traiter_touche:
moveq #GWVA_PRGRET_NOT_CONSUMED,d6
rts
;----------
* save.l d0/a0/a1
*
* v_hide_c
*
* movem.l (sp),d0/a0/a1
*
* bsr GWVA_WFORM_OBJ_PRG_HIDE_CURSOR
*
* movem.l (sp),d0/a0/a1
*
* cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
* beq.s .no_lost_focus_event_cause_no_change_objet
* move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
* move #GWVA_EVNT_LOSTFOCUS,d7
* lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
* bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
*
* movem.l (sp),d0/a0/a1
*
*.no_lost_focus_event_cause_no_change_objet:
*
* move.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),-(sp) ; on sauve avant d'écraser
*
* *move d0,GWVA_WIND_OBJ_FOCUSED_OBJECT(a0)
*
* move.l GWVA_WFORM_OBJ_FORM_PTR(a1),a2
* move.w d0,d1
* mulu #L_OBJECT,d1
* move.w ([a2,d1.l,ob_spec],te_txtlen),d1
* subq.w #1,d1
* cmp.w GWVA_WIND_OBJ_FOCUSED_OBJ_CURSOR_POS(a0),d1
* blt.s .pos_curseur_sup_longueur_texte
* move.w GWVA_WIND_OBJ_FOCUSED_OBJ_CURSOR_POS(a0),d1
*.pos_curseur_sup_longueur_texte: ; positionne si possible au meme endroit dans le nouveau champ texte éditable
* bsr GWVA_WFORM_OBJ_PRG_DRAW_CURSOR
*
* move.w (sp)+,d1
* movem.l (sp),d0/a0/a1
*
* cmp.w GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d1
* beq.s .no_got_focus_cause_no_change_objet
* ; d0 : objet gagnant le focus
* move #GWVA_EVNT_GOTFOCUS,d7
* lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
* bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
*.no_got_focus_cause_no_change_objet:
*
* v_show_c #1
*
* load.l d0/a0/a1
*
*.next_obj_pas_editable:
* bra GWVA_MAIN_EVENTS_LOOP
*
*.fkbd_pas_pu_traiter_touche:
*
* move.w int_out+2*2,d0 ; touche
*
* save.l d0/a0/a1
*
* v_hide_c
*
* movem.l (sp),d0/a0/a1
*
* ; Entrée : a0=ptr fenêtre
* ; : a1=ptr spec ptr
* ; : d0=touche
*
* bsr GWVA_WFORM_OBJ_PRG_INSERT_CHAR_IN_WINDOW
*
* ; sortie : d0=code d'erreur (0=touche non traitée)
* ; la position du curseur a été modifiée si nécéssaire
*
* save.w d0
* v_show_c #1
* load.w d1 ; d1 : code de retour
*
* load.l d0/a0/a1
*
*; BUG de l'AES : on ne sait pas si la touche a pu etre traité correctement par le champ
*; éditable. Par exemple, si on essaie de rentrer une lettre dans un champ décimal,
*; on n'est pas averti par l'AES que l'opération est impossible.
*; Par conséquent, on envoit des messages CHANGED alors que le champ texte n'a pas été
*; modifié.
*
* tst d1
* beq .touche_intraitable
*
* ; pour l'event text changed ...
*
* cmp.w #$4b00,GWVA_APP_OBJ_EVNT_MULTI_KC
* beq.s .fleche_gauche
* cmp.w #$4d00,GWVA_APP_OBJ_EVNT_MULTI_KC
* beq.s .fleche_droite
*
* save.l a0/a1
* move GWVA_WIND_OBJ_FOCUSED_OBJECT(a0),d0
* move #GWVA_EVNT_CHANGED,d7
* lea GWVA_WFORM_OBJ_START_OBJ_LIST(a1),a2
* bsr GWVA_WIND_OBJ_PRG_SEARCH_EVNT
* load.l a0/a1
*
*.fleche_gauche:
*.fleche_droite:
*
* bra GWVA_MAIN_EVENTS_LOOP
*
*.end_evnt_keyboard:
*.pas_window_formulaire:
*******
ifeq 1
save.l a0-a2
form_keybd GWVA_FORM_KEYB_IN_TREE_PTR(a1),#0,#1,d0
load.l a0-a2
move.w d0,GWVA_FORM_KEYB_OUT_RET_CODE(a2)
move.w int_out+1*2,GWVA_FORM_KEYB_OUT_NEW_OBJECT(a2)
tst d0 ; 0 = bouton 'exit' default, 1 = pas de bouton en 'default'
bne.s .pas_objet_defaut_active
; on peut se rebrancher ici apres un 'enter' dans un champs de texte editable
.objet_defaut_active:
move.w int_out+1*2,d0 ; default object
move.w d0,d1
mulu #L_OBJECT,d1
add.l GWVA_WFORM_OBJ_FORM_PTR(a1),d1
move.l d1,a2
bclr #SELECTED,ob_state+1(a2) ; désélection de l'objet
btst #DISABLED,ob_state+1(a2) ; objet 'default' disable ? -> on doit le réafficher deselectionner ?_PATCH_?
bne.s .objet_defaut_active_but_disable
btst #SELECTABLE,ob_flags+1(a2) ; objet 'default' pas selectable ? -> on doit le réafficher deselectionner ?_PATCH_?
beq.s .objet_defaut_active_but_not_selectable
; pas de redessin si le bouton 'default' est selectable et pas disable ->
; la routine de clic souris s'en chargera mieux que nous ...
bra .transform_a_keyb_evnt_into_a_click_evnt
.objet_defaut_active_but_not_selectable:
.objet_defaut_active_but_disable:
; il faut faire un redessin car le gem sur un form_keyb
; et un 'enter' va enfoncer meme un objet disable
; et la routine click, elle, plus intelligente ne le fera pas
save.l d0/a0-a1
move.w #1,d1
clr d2
bsr GWVA_FORM_WIND_OBJ_PRG_REDRAW_PART
load.l d0/a0-a1
bra .transform_a_keyb_evnt_into_a_click_evnt
.touche_intraitable:
.pas_objet_defaut_active:
bra .end_evnt_keyboard
endc ; ifeq 1
;------------------------------------------------------------------------------
; Method name : GWVA_METHOD_FORM_OBJC_EDIT
; Asm label : GWVA_FORM_PRG_FORM_OBJC_EDIT
; Description : Méthode pour traiter l'effet de l'appui d'une touche sur un champ texte
;
; in : a0.l = pointeur sur l'objet
; in : a1.l = pointeur sur le buffer de sortie typé GWVA_FORM_OBJC_EDIT_IN
; in : a2.l = pointeur sur le buffer de sortie typé GWVA_FORM_OBJC_EDIT_OUT
; in : d0.w = index GEM de l'objet devant faire l'objc_edit
; in : d1.w = position du curseur
; in : d2.w = [ Key state.w | Key code.w ]
; out : d6.w = GWVA_PRGRET_NOT_CONSUMED ou GWVA_PRGRET_CONSUMED
;
; 10/05/98 : Création
;------------------------------------------------------------------------------
GWVA_FORM_PRG_FORM_OBJC_EDIT:
save.l a0-a2/d0-d2
objc_edit GWVA_FORM_OBJC_EDIT_IN_TREE_PTR(a1),d0,d2,d1,#2
move d0,d3
load.l a0-a2/d0-d2
move.w d3,GWVA_FORM_OBJC_EDIT_OUT_RET_CODE(a2)
move.w int_out+1*2,GWVA_FORM_OBJC_EDIT_OUT_CURS_NEW_POS(a2) ; nouvelle position du curseur
moveq #GWVA_PRGRET_CONSUMED,d6
rts
;------------------------------------------------------------------------------
;!!!!!!!!!!!!!!!!!!!!!
endc ; ifd MDL_FORM_EDITABLE_TEXT
;!!!!!!!!!!!!!!!!!!!!!
ifd OPT_GWVA_WFORM_POS_CURS_WITH_MOUSE
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_FORM_PRG_DRAW_CURSOR_X
; Description : positionne et affiche le curseur texte à une position x écran
; Description : (dans un champ éditable) + mets à jour la structure
;
; in : a0.l = pointeur sur l'objet fenêtre contenant l'objet
; in : d0.w = No objet texte editable à focuser
; in : d1.w = position x absolue où positionner le curseur
;
; 05/09/98 : Création
;------------------------------------------------------------------------------
GWVA_FORM_PRG_DRAW_CURSOR_X:
move.w d0,GWVA_WFORM_OBJ_FOCUSED_IDX(a0)
bsr GWVA_WFORM_PRG_RETURN_POSITON_EDITABLE_CHAR_UNDER_X
move.w d0,GWVA_WFORM_OBJ_FOCUSED_IDX_CURSOR_POS(a0)
bsr GWVA_WFORM_REDRAW_CURSOR
* bsr GWVA_WFORM_PRG_DRAW_CURSOR
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_WFORM_PRG_RETURN_POSITON_EDITABLE_CHAR_UNDER_X
; Description : retourne la position en caractère avec en entrée la position
; Description : en X dans un champs éditable
;
; in : a0.l = pointeur sur l'objet fenêtre contenant l'objet
; in : d0.w = No objet texte editable à focuser
; in : d1.w = position x absolue où positionner le curseur
; out : d0.w = position curseur dans le champ éditable
;
; 05/09/98 : Création
;------------------------------------------------------------------------------
GWVA_WFORM_PRG_RETURN_POSITON_EDITABLE_CHAR_UNDER_X:
move.l GWVA_WRSC_OBJ_TREE_PTR(a0),a1
move.w d0,d4
mulu #L_OBJECT,d4
lea (a1,d4.l),a2
move.l ob_spec(a2),a1
save.l a0-a2/d0-d1
bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT
; d0 : position du curseur dans l'objet texte
; d1 : position du curseur dans le champ editable
; d2 : longueur du champ texte
load.l a0-a2/d0-d1
move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_WIDTH,d4
cmp.w #5,te_font(a1) ; small font ?
bne.s .pas_de_small_font
move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_WIDTH,d4
.pas_de_small_font:
mulu d4,d2 ; taille du text en pixel
save.l a0-a2/d0-d2
objc_offset GWVA_WRSC_OBJ_TREE_PTR(a0),d0
load.l a0-a2/d0-d2
move.w int_out+1*2,d4 ; position x de l'objet texte
cmp.w #0,te_just(a1) : justification gauche ?
beq.s .justified_left
cmp.w #1,te_just(a1) : justification droite ?
bne.s .not_justified_right
move.w ob_width(a2),d5
sub.w d2,d5
add.w d5,d4
.not_justified_right:
cmp.w #2,te_just(a1) : justification centrée ?
bne.s .not_justified_center
move.w ob_width(a2),d5
sub.w d2,d5
asr.w #1,d5
add.w d5,d4
.not_justified_center:
.justified_left:
; -> d4 : position x du debut du texte en pixel
sub.w d4,d1 ; position relative x de la souris dans le texte
bpl.s .souris_a_droite_debut_texte
moveq #0,d1
.souris_a_droite_debut_texte:
cmp.w d2,d1
blt.s .souris_a_gauche_fin_texte
move.w d2,d1
.souris_a_gauche_fin_texte:
move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_WIDTH,d4
cmp.w #5,te_font(a1) ; small font ?
bne.s .pas_de_small_font2
move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_WIDTH,d4
.pas_de_small_font2:
ext.l d1
divu d4,d1 ; d1 : caractère où placer le curseur
lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT+2,a1
add.w d1,d1
add.w d1,a1 ; positionnement dans le texte
.recherche_texte:
lea -2(a1),a1
cmp.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a1
beq.s .curseur_debut_texte
cmp.b #'_',-2+1(a1)
beq.s .recherche_texte
.curseur_debut_texte:
lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a2
clr.w d0
.determine_position_curseur:
cmp.l a2,a1
beq.s .position_curseur_determinee
tst.b (a2)
beq.s .pas_caractere_editable
add.w #1,d0
.pas_caractere_editable:
lea 2(a2),a2
bra.s .determine_position_curseur
.position_curseur_determinee:
; -> d0.w
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT
; Description : retourne les positions 1) dans le texte 2) dans le masque
; Description : + longeur texte pour un champs éditable
;
; in : a1.l = pointeur sur l'ob_spec de l'objet
; out : d0.w = position du curseur dans l'objet texte (entre 0(à gauche 1er) et d2(à droite dernier))
; out : d1.w = position du curseur dans le champ editable
; out : d2.w = longueur du champ texte
;
; 05/09/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT:
move.l te_ptmplt(a1),a3
lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a5
.reconstruit_texte_non_editable:
clr.b (a5)+ ; type de texte - non editable
move.b (a3)+,(a5)+
tst.b -1(a5)
bne.s .reconstruit_texte_non_editable
lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT-2,a3
move.l te_ptext(a1),a4
.reconstruit_texte_editable:
lea 2(a3),a3
tst.b 1(a3)
beq.s .plus_de_texte_dispo
cmp.b #'_',1(a3) ; marque d'emplacement d'un texte editable
bne.s .reconstruit_texte_editable
tst.b (a4)
beq.s .plus_de_texte_editable_dispo
move.b (a4)+,1(a3)
move.b #1,(a3) ; ce caractère est éditable
tst.b (a4)
bne.s .reconstruit_texte_editable
lea 2(a3),a3
.plus_de_texte_editable_dispo:
lea -2(a3),a5
.recherche_pos_curs:
lea 2(a5),a5
tst.b 1(a5)
beq.s .plus_de_texte_dispo
cmp.b #'_',1(a5)
bne.s .recherche_pos_curs
move.l a5,a3
.plus_de_texte_dispo:
sub.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a3
move.w a3,d0
asr.w #1,d0 ; position du curseur dans le champ texte
sub.l te_ptext(a1),a4
move.w a4,d1 ; position du curseur dans le champ editable
lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT-2,a3
.calcul_longueur_texte:
lea 2(a3),a3
tst.b 1(a3)
bne.s .calcul_longueur_texte
sub.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a3
move.w a3,d2
asr.w #1,d2 ; longueur du texte
rts
BSS
GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT: ds.b 256+2
TEXT
endc ; ifd OPT_GWVA_WFORM_POS_CURS_WITH_MOUSE
;------------------------------------------------------------------------------